package patient

import (
	"api-gateway/basic/config"
	proto "api-gateway/basic/proto"
	"api-gateway/handler/request"
	"context"
	"github.com/gin-gonic/gin"
	"net/http"
	"time"
)

// CreateConsultation 创建问诊
func CreateConsultation(c *gin.Context) {
	userId := c.GetInt64("userId")

	var form request.CreateConsultationReq
	if err := c.ShouldBindJSON(&form); err != nil {
		c.JSON(http.StatusOK, gin.H{"code": 400, "msg": "参数错误"})
		return
	}

	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
	defer cancel()

	resp, err := config.PatientClient.CreateConsultation(ctx, &proto.CreateConsultationRequest{
		UserId:             userId,
		DoctorId:           form.DoctorId,
		PatientId:          form.PatientId,
		ConsultationType:   int32(form.ConsultationType),
		SymptomDescription: form.SymptomDescription,
		ImageUrls:          form.ImageUrls,
	})
	if err != nil {
		c.JSON(http.StatusOK, gin.H{"code": 500, "msg": "创建问诊失败"})
		return
	}

	c.JSON(http.StatusOK, gin.H{
		"code": 200,
		"msg":  resp.Message,
		"data": gin.H{
			"consultation_id": resp.ConsultationId,
		},
	})
}

// SubmitDescription 提交病情描述
func SubmitDescription(c *gin.Context) {
	var form request.SubmitDescriptionReq
	if err := c.ShouldBindJSON(&form); err != nil {
		c.JSON(http.StatusOK, gin.H{"code": 400, "msg": "参数错误"})
		return
	}

	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
	defer cancel()

	resp, err := config.PatientClient.SubmitConsultationDescription(ctx, &proto.SubmitConsultationDescriptionRequest{
		Description: form.Description,
	})
	if err != nil {
		c.JSON(http.StatusOK, gin.H{"code": 500, "msg": "提交病情描述失败"})
		return
	}

	c.JSON(http.StatusOK, gin.H{
		"code": 200,
		"msg":  resp.Message,
	})
}

// SelectConsultationType 选择问诊方式
//func SelectConsultationType(c *gin.Context) {
//	var form request.SelectConsultationTypeReq
//	if err := c.ShouldBindJSON(&form); err != nil {
//		c.JSON(http.StatusOK, gin.H{"code": 400, "msg": "参数错误"})
//		return
//	}
//
//	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
//	defer cancel()
//
//	resp, err := config.PatientClient.SelectConsultationType(ctx, &proto.SelectConsultationTypeRequest{
//		ConsultationId:   form.ConsultationId,
//		ConsultationType: int32(form.ConsultationType),
//	})
//	if err != nil {
//		c.JSON(http.StatusOK, gin.H{"code": 500, "msg": "选择问诊方式失败"})
//		return
//	}
//
//	c.JSON(http.StatusOK, gin.H{
//		"code": 200,
//		"msg":  resp.Message,
//	})
//}

// SendMessage 发送消息
//func SendMessage(c *gin.Context) {
//	userId, exists := c.GetInt64("userId")
//	if !exists {
//		c.JSON(http.StatusOK, gin.H{
//			"code": 401,
//			"msg":  "用户未登录",
//		})
//		return
//	}
//
//	var form request.SendMessageReq
//	if err := c.ShouldBindJSON(&form); err != nil {
//		c.JSON(http.StatusOK, gin.H{
//			"code": 400,
//			"msg":  "参数错误",
//		})
//		return
//	}
//
//	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
//	defer cancel()
//
//	resp, err := config.PatientClient.SendMessage(ctx, &proto.SendMessageRequest{
//		UserId:         userId,
//		ConsultationId: form.ConsultationId,
//		MessageType:    int32(form.MessageType),
//		Content:        form.Content,
//		ImageUrl:       form.ImageUrl,
//		AudioUrl:       form.AudioUrl,
//	})
//	if err != nil {
//		c.JSON(http.StatusOK, gin.H{"code": 500, "msg": "发送消息失败"})
//		return
//	}
//
//	c.JSON(http.StatusOK, gin.H{
//		"code": 200,
//		"msg":  resp.Message,
//		"data": gin.H{
//			"message_id": resp.MessageId,
//			"status":     "sent",
//			"timestamp":  resp.Timestamp,
//		},
//	})
//}
//
//// InitiateCall 发起通话
//func InitiateCall(c *gin.Context) {
//	userId, exists := c.GetInt64("userId")
//	if !exists {
//		c.JSON(http.StatusOK, gin.H{
//			"code": 401,
//			"msg":  "用户未登录",
//		})
//		return
//	}
//
//	var form request.InitiateCallReq
//	if err := c.ShouldBindJSON(&form); err != nil {
//		c.JSON(http.StatusOK, gin.H{
//			"code": 400,
//			"msg":  "参数错误",
//		})
//		return
//	}
//
//	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
//	defer cancel()
//
//	resp, err := config.PatientClient.InitiateCall(ctx, &proto.InitiateCallRequest{
//		UserId:         userId,
//		ConsultationId: form.ConsultationId,
//		CallType:       int32(form.CallType),
//	})
//	if err != nil {
//		c.JSON(http.StatusOK, gin.H{"code": 500, "msg": "发起通话失败"})
//		return
//	}
//
//	c.JSON(http.StatusOK, gin.H{
//		"code": 200,
//		"msg":  resp.Message,
//		"data": gin.H{
//			"call_id":     resp.CallId,
//			"room_id":     resp.RoomId,
//			"call_status": "initiated",
//		},
//	})
//}
//
//// GetMessages 获取问诊消息记录
//func GetMessages(c *gin.Context) {
//	userId, exists := c.GetInt64("userId")
//	if !exists {
//		c.JSON(http.StatusOK, gin.H{
//			"code": 401,
//			"msg":  "用户未登录",
//		})
//		return
//	}
//
//	// 获取问诊ID
//	consultationID := c.Param("id")
//	if consultationID == "" {
//		c.JSON(http.StatusOK, gin.H{
//			"code": 400,
//			"msg":  "问诊ID不能为空",
//		})
//		return
//	}
//
//	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
//	defer cancel()
//
//	resp, err := config.PatientClient.GetConsultationMessages(ctx, &proto.GetConsultationMessagesRequest{
//		UserId:         userId,
//		ConsultationId: consultationID,
//	})
//	if err != nil {
//		c.JSON(http.StatusOK, gin.H{"code": 500, "msg": "获取消息记录失败"})
//		return
//	}
//
//	c.JSON(http.StatusOK, gin.H{
//		"code": 200,
//		"msg":  resp.Message,
//		"data": resp.Messages,
//	})
//}
//
//// GetConsultationDoctorsByDepartment 按科室查询问诊医生
//func GetConsultationDoctorsByDepartment(c *gin.Context) {
//	// 获取科室ID
//	departmentID := c.Param("id")
//	if departmentID == "" {
//		c.JSON(http.StatusOK, gin.H{
//			"code": 400,
//			"msg":  "科室ID不能为空",
//		})
//		return
//	}
//
//	deptID, err := strconv.ParseInt(departmentID, 10, 64)
//	if err != nil {
//		c.JSON(http.StatusOK, gin.H{
//			"code": 400,
//			"msg":  "无效的科室ID",
//		})
//		return
//	}
//
//	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
//	defer cancel()
//
//	resp, err := config.PatientClient.GetConsultationDoctorsByDepartment(ctx, &proto.GetConsultationDoctorsByDepartmentRequest{
//		DepartmentId: deptID,
//	})
//	if err != nil {
//		c.JSON(http.StatusOK, gin.H{"code": 500, "msg": "获取医生列表失败"})
//		return
//	}
//
//	c.JSON(http.StatusOK, gin.H{
//		"code": 200,
//		"msg":  resp.Message,
//		"data": resp.Doctors,
//	})
//}
//
//// GetConsultationDoctorsByDisease 按疾病查询问诊医生
//func GetConsultationDoctorsByDisease(c *gin.Context) {
//	// 获取疾病ID
//	diseaseID := c.Param("id")
//	if diseaseID == "" {
//		c.JSON(http.StatusOK, gin.H{
//			"code": 400,
//			"msg":  "疾病ID不能为空",
//		})
//		return
//	}
//
//	disID, err := strconv.ParseInt(diseaseID, 10, 64)
//	if err != nil {
//		c.JSON(http.StatusOK, gin.H{
//			"code": 400,
//			"msg":  "无效的疾病ID",
//		})
//		return
//	}
//
//	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
//	defer cancel()
//
//	resp, err := config.PatientClient.GetConsultationDoctorsByDisease(ctx, &proto.GetConsultationDoctorsByDiseaseRequest{
//		DiseaseId: disID,
//	})
//	if err != nil {
//		c.JSON(http.StatusOK, gin.H{"code": 500, "msg": "获取医生列表失败"})
//		return
//	}
//
//	c.JSON(http.StatusOK, gin.H{
//		"code": 200,
//		"msg":  resp.Message,
//		"data": resp.Doctors,
//	})
//}
//
//// GetConsultationDoctorsByHospital 按医院查询问诊医生
//func GetConsultationDoctorsByHospital(c *gin.Context) {
//	// 获取医院ID
//	hospitalID := c.Param("id")
//	if hospitalID == "" {
//		c.JSON(http.StatusOK, gin.H{
//			"code": 400,
//			"msg":  "医院ID不能为空",
//		})
//		return
//	}
//
//	hosID, err := strconv.ParseInt(hospitalID, 10, 64)
//	if err != nil {
//		c.JSON(http.StatusOK, gin.H{
//			"code": 400,
//			"msg":  "无效的医院ID",
//		})
//		return
//	}
//
//	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
//	defer cancel()
//
//	resp, err := config.PatientClient.GetConsultationDoctorsByHospital(ctx, &proto.GetConsultationDoctorsByHospitalRequest{
//		HospitalId: hosID,
//	})
//	if err != nil {
//		c.JSON(http.StatusOK, gin.H{"code": 500, "msg": "获取医生列表失败"})
//		return
//	}
//
//	c.JSON(http.StatusOK, gin.H{
//		"code": 200,
//		"msg":  resp.Message,
//		"data": resp.Doctors,
//	})
//}
//
//// UploadCasePhoto 上传病例照片
//func UploadCasePhoto(c *gin.Context) {
//	userId, exists := c.GetInt64("userId")
//	if !exists {
//		c.JSON(http.StatusOK, gin.H{
//			"code": 401,
//			"msg":  "用户未登录",
//		})
//		return
//	}
//
//	// 获取问诊ID
//	consultationID := c.Param("id")
//	if consultationID == "" {
//		c.JSON(http.StatusOK, gin.H{
//			"code": 400,
//			"msg":  "问诊ID不能为空",
//		})
//		return
//	}
//
//	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
//	defer cancel()
//
//	// 实际项目中需要处理文件上传
//	// 这里简化处理，假设已上传到某个URL
//	resp, err := config.PatientClient.UploadCasePhoto(ctx, &proto.UploadCasePhotoRequest{
//		UserId:         userId,
//		ConsultationId: consultationID,
//		ImageUrl:       "http://example.com/uploads/case_photo.jpg", // 实际应该从文件上传获取
//	})
//	if err != nil {
//		c.JSON(http.StatusOK, gin.H{"code": 500, "msg": "上传失败"})
//		return
//	}
//
//	c.JSON(http.StatusOK, gin.H{
//		"code": 200,
//		"msg":  resp.Message,
//		"data": gin.H{
//			"image_url": resp.ImageUrl,
//		},
//	})
//}
//
//// SelectConsultationPatient 选择患者
//func SelectConsultationPatient(c *gin.Context) {
//	userId, exists := c.GetInt64("userId")
//	if !exists {
//		c.JSON(http.StatusOK, gin.H{
//			"code": 401,
//			"msg":  "用户未登录",
//		})
//		return
//	}
//
//	// 获取问诊ID
//	consultationID := c.Param("id")
//	if consultationID == "" {
//		c.JSON(http.StatusOK, gin.H{
//			"code": 400,
//			"msg":  "问诊ID不能为空",
//		})
//		return
//	}
//
//	// 绑定请求参数
//	type Request struct {
//		PatientID uint `json:"patient_id" binding:"required"`
//	}
//	var req Request
//	if err := c.ShouldBindJSON(&req); err != nil {
//		c.JSON(http.StatusOK, gin.H{
//			"code": 400,
//			"msg":  "参数错误",
//		})
//		return
//	}
//
//	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
//	defer cancel()
//
//	resp, err := config.PatientClient.SelectConsultationPatient(ctx, &proto.SelectConsultationPatientRequest{
//		UserId:         userId,
//		ConsultationId: consultationID,
//		PatientId:      int64(req.PatientID),
//	})
//	if err != nil {
//		c.JSON(http.StatusOK, gin.H{"code": 500, "msg": "选择患者失败"})
//		return
//	}
//
//	c.JSON(http.StatusOK, gin.H{
//		"code": 200,
//		"msg":  resp.Message,
//	})
//}
//
//// PayConsultationWithAlipay 问诊支付宝支付
//func PayConsultationWithAlipay(c *gin.Context) {
//	userId, exists := c.GetInt64("userId")
//	if !exists {
//		c.JSON(http.StatusOK, gin.H{
//			"code": 401,
//			"msg":  "用户未登录",
//		})
//		return
//	}
//
//	var form request.PayConsultationReq
//	if err := c.ShouldBindJSON(&form); err != nil {
//		c.JSON(http.StatusOK, gin.H{
//			"code": 400,
//			"msg":  "参数错误",
//		})
//		return
//	}
//
//	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
//	defer cancel()
//
//	resp, err := config.PatientClient.GenerateConsultationPaymentLink(ctx, &proto.GeneratePaymentLinkRequest{
//		OrderId:     form.ConsultationId,
//		PaymentType: "alipay",
//		UserId:      userId,
//	})
//	if err != nil {
//		c.JSON(http.StatusOK, gin.H{"code": 500, "msg": "生成支付链接失败"})
//		return
//	}
//
//	c.JSON(http.StatusOK, gin.H{
//		"code": 200,
//		"msg":  resp.Message,
//		"data": gin.H{
//			"pay_url": resp.PayUrl,
//		},
//	})
//}
//
//// PayConsultationWithWechat 问诊微信支付
//func PayConsultationWithWechat(c *gin.Context) {
//	userId, exists := c.GetInt64("userId")
//	if !exists {
//		c.JSON(http.StatusOK, gin.H{
//			"code": 401,
//			"msg":  "用户未登录",
//		})
//		return
//	}
//
//	var form request.PayConsultationReq
//	if err := c.ShouldBindJSON(&form); err != nil {
//		c.JSON(http.StatusOK, gin.H{
//			"code": 400,
//			"msg":  "参数错误",
//		})
//		return
//	}
//
//	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
//	defer cancel()
//
//	resp, err := config.PatientClient.GenerateConsultationWechatPayParams(ctx, &proto.GenerateWechatPayParamsRequest{
//		OrderId: form.ConsultationId,
//		UserId:  userId,
//	})
//	if err != nil {
//		c.JSON(http.StatusOK, gin.H{"code": 500, "msg": "生成支付参数失败"})
//		return
//	}
//
//	c.JSON(http.StatusOK, gin.H{
//		"code": 200,
//		"msg":  resp.Message,
//		"data": gin.H{
//			"appid":     resp.AppId,
//			"prepay_id": resp.PrepayId,
//			"code_url":  resp.CodeUrl,
//		},
//	})
//}
//
//// ConsultationAlipayCallback 问诊支付宝回调
//func ConsultationAlipayCallback(c *gin.Context) {
//	// 获取表单参数
//	tradeNo := c.PostForm("trade_no")
//	outTradeNo := c.PostForm("out_trade_no")
//	tradeStatus := c.PostForm("trade_status")
//
//	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
//	defer cancel()
//
//	// RPC调用 - 处理支付宝回调
//	_, _ = config.PatientClient.ProcessConsultationPaymentCallback(ctx, &proto.PaymentCallbackRequest{
//		TradeNo:     tradeNo,
//		OutTradeNo:  outTradeNo,
//		TradeStatus: tradeStatus,
//		PaymentType: "alipay",
//	})
//
//	// 返回success告知支付宝不要重试
//	c.String(http.StatusOK, "success")
//}
//
//// ConsultationWechatCallback 问诊微信回调
//func ConsultationWechatCallback(c *gin.Context) {
//	// 读取XML数据
//	var xmlData struct {
//		ReturnCode    string `xml:"return_code"`
//		OutTradeNo    string `xml:"out_trade_no"`
//		TransactionId string `xml:"transaction_id"`
//		ResultCode    string `xml:"result_code"`
//	}
//
//	if err := c.ShouldBindXML(&xmlData); err == nil && xmlData.ReturnCode == "SUCCESS" && xmlData.ResultCode == "SUCCESS" {
//		ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
//		defer cancel()
//
//		// RPC调用 - 处理微信回调
//		_, _ = config.PatientClient.ProcessConsultationPaymentCallback(ctx, &proto.PaymentCallbackRequest{
//			TradeNo:     xmlData.TransactionId,
//			OutTradeNo:  xmlData.OutTradeNo,
//			TradeStatus: xmlData.ResultCode,
//			PaymentType: "wechat",
//		})
//	}
//
//	// 返回成功响应给微信服务器
//	c.Header("Content-Type", "application/xml")
//	c.String(http.StatusOK, `<xml><return_code><![CDATA[SUCCESS]]></return_code></xml>`)
//}
